package com.run.cat.common.util;



import org.apache.commons.collections.MapUtils;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;

/**
 *
 * 类名: EmptyUtil 作用说明: 对"空"的判断公共方法 创建时间: 2015年11月13日 上午11:12:33
 *
 * @author huangyuancheng
 * @since JDK 1.8
 */
public class EmptyUtil {

	/**
	 *
	 * 方法作用说明:判断Object是否不为空,先判断是否不为null，为null返回false;不为null 继续判断toString()是否不为空
	 * 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @param <T>   泛型
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static <T> boolean isNotEmpty(Object value) {
		if (null != value) {
			boolean falg = !EmptyUtil.isEmpty(value.toString());
			if (falg) {
				String values = String.valueOf(value);
				if (values.equals("{}")) {
					falg = false;
				}
			}
			return falg;
		}
		return false;
	}

	/**
	 *
	 * 方法作用说明:判断list是否不为空 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param lists 参数
	 * @param <T>   泛型
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static <T> boolean isNotEmpty(List<T> lists) {
		if (null != lists) {
			return !lists.isEmpty();
		}
		return false;
	}

	/**
	 * 判断数组是否不为空 方法作用说明:isNotEmpty 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param datas 参数
	 * @param <T>   泛型
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static <T> boolean isNotEmpty(T[] datas) {
		if (null != datas) {
			return datas.length != 0;
		}
		return false;
	}

	/**
	 *
	 * 方法作用说明:判断字符串是否不为空 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param datas string参数
	 * @return 不为空返回true，为空返回false
	 * @since JDK 1.8
	 */
	public static boolean isNotEmpty(String datas) {
		return StringUtils.hasText(datas);
	}

	/**
	 * 判断Map是否不为空 方法作用说明:isNotEmpty 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param datas 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isNotEmpty(Map datas) {
		return MapUtils.isNotEmpty(datas);
	}

	/**
	 * 判断字符串不能为空，且不能为“undefined”，主要是在js选择后验证，可以调用此方法 方法作用说明:isNotUndefinedChars
	 * 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static boolean isNotUndefinedChars(String value) {
		if (isNotEmpty(value)) {
			return !"undefined".equals(value.trim().toLowerCase());
		}
		return false;
	}

	/**
	 * 判断字符串不能为空，且不能为“null”，主要是在js选择后验证，可以调用此方法 方法作用说明:isNotNullChars 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static boolean isNotNullChars(String value) {
		if (isNotEmpty(value)) {
			return !"null".equals(value.trim().toLowerCase());
		}
		return false;
	}

	/**
	 * 判断字符串不能为空，且不能为“null”和“undefined”，主要是在js选择后验证，可以调用此方法 方法作用说明:isNotEmptyChars
	 * 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static boolean isNotEmptyChars(String value) {
		return isNotUndefinedChars(value) && isNotNullChars(value);
	}

	/**
	 * 判断list是否为空 方法作用说明:isEmpty 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param lists 参数
	 * @param <T>   泛型
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static <T> boolean isEmpty(List<T> lists) {
		if (null == lists) {
			return true;
		} else if (lists.isEmpty()) {
			return true;
		}
		return false;
	}

	/**
	 * 判断数组是否为空 方法作用说明:isEmpty 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param datas 参数
	 * @param <T>   泛型
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static <T> boolean isEmpty(T[] datas) {
		if (null == datas){
			return true;
		} else if (datas.length == 0) {
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串是否为空 方法作用说明:isEmpty 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param datas 参数
	 * @return 为空返回true
	 * @since JDK 1.8
	 */
	public static boolean isEmpty(String datas) {
		return !StringUtils.hasText(datas);
	}

	/**
	 * 判断Map是否为空 方法作用说明:isEmpty 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param datas 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isEmpty(Map datas) {
		return MapUtils.isEmpty(datas);
	}

	/**
	 * 判断字符串为空，或为“undefined”，主要是在js选择后验证，可以调用此方法 方法作用说明:isUndefinedChars 使用说明:
	 * 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static boolean isUndefinedChars(String value) {
		if (isEmpty(value)) {
			return true;
		} else if ("undefined".equals(value.trim().toLowerCase())) {
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串为空，或为“null”，主要是在js选择后验证，可以调用此方法 方法作用说明:isNullChars 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static boolean isNullChars(String value) {
		if (isEmpty(value)) {
			return true;
		} else if ("null".equals(value.trim().toLowerCase())) {
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串为空，或为“null”和“undefined”，主要是在js选择后验证，可以调用此方法 方法作用说明:isEmptyChars 使用说明:
	 * 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static boolean isEmptyChars(String value) {
		return isNullChars(value) || isUndefinedChars(value);
	}

	/**
	 * 判断Object是否不为空,先判断是否不为null，为null返回false;不为null 继续判断toString()是否不为空
	 * 方法作用说明:isEmpty 使用说明: 使用注意事项:
	 *
	 * @author huangyuancheng
	 * @param value 参数
	 * @return boolean
	 * @since JDK 1.8
	 */
	public static boolean isEmpty(Object value) {
		if (null == value) {
			return true;
		} else if (EmptyUtil.isEmpty(value.toString())) {
			return true;
		}
		return false;
	}

}
